#####################################################################
# Product:      KnowledgeEngine (Plone Edition)
#
# File:         DatetimeSelectorEditlet.py
#
# Copyright:    Copyright (c) 2006, Faulkner Technologies
#
# Author:       Tinh Truong
#
# Description:  This file defines the DateTimeEditlet class, that is
#               used to generate date/time editlets for property editors.
#
#               It's implementation is based on the LGPL DHTML
#               DateTimeChooser By DynArch.
#               (http://www.dynarch.com/projects/calendar/)
#
#               It uses the Zope DateTime to represent dates and time.
#
# See Also:     PropertyEditlet, PropertyRefleciton, 
#               PropertyDefinition, PropertyAccess 
#####################################################################

#####################################################################
## KnowledgeEngine Library Imports
from Products.KnowledgeEngine.Common import *
from Products.KnowledgeEngine.Core import *
from Products.KnowledgeEngine.Editlet import Editlet
from Products.KnowledgeEngine.PropertyTypes import *
from Products.KnowledgeEngine.PropertyFormats import *
from Products.KnowledgeEngine.PropertyStructures import *

#####################################################################
## Zope Library Imports
from DateTime import DateTime
 
#####################################################################
## Python Library Imports
# (none)

#####################################################################
## DateTimeEditlet Class Definition
class DatetimeSelectorEditlet(Editlet):
    """
        An editlet for editing date time properties  
    """
    
    #---------------------------------------------------------------#
    
    def isEditable(self, propertyDefinition, propertyAccess=None, value=None, isForConstructor=false, REQUEST=None, context=None):
        """
            Returns if the specified propertyDefinition can be
            edited by this editlet
        """
        
        #return propertyDefinition.getType() == pt_STRING and propertyDefinition.getStructure() == ps_ATOMIC and (propertyDefinition.getFormat() == pf_NATIVE or propertyDefinition.getFormat() == pf_TEXT_SINGLELINE) and not propertyDefinition.hasEnumeratedValues()        
        return propertyDefinition.getType() in [pt_DATETIMESELECTOR] and propertyDefinition.getStructure() == ps_ATOMIC and propertyDefinition.getFormat() == pf_NATIVE
        
    #---------------------------------------------------------------#

    def generateEditorFor(self, propertyDefinition, propertyAccess=None, value=None, isForConstructor=false, REQUEST=None, context=None):
        """
            Returns a HTML editlet for the specified property.
        """

        #the resulting editlet
        result = ""
        
        ##get the value for the property
        if isForConstructor:
            value = propertyDefinition.getDefaultValue()
        else:
            #get the value for the property
            value = propertyAccess.getPropertyValue(propertyDefinition.getIdentity())                                                    

        #is the default None? if so we use the current date
        if value is None:
            value = propertyDefinition.getDefaultValue()

        #is the property writeable?
        if propertyDefinition.isWritePermitted():
       
            if propertyDefinition.isReadPermitted():
                #get the value for the property
                if isForConstructor:
                    value = propertyDefinition.getDefaultValue()
                else:
                    #get the value for the property
                    value = propertyAccess.getPropertyValue(propertyDefinition.getIdentity())                                                    
            else:
                #not readable so the default is empty
                value = ""
            result = "<input type=\"text\"  id=\"ke%s\" name=\"ke%s\" size=\"%s\" value=\"%s\">" % (propertyDefinition.getIdentity(), propertyDefinition.getIdentity(), 40, toHTML(value))           
                        
        return result        
        
    #---------------------------------------------------------------#

    def updatePropertyWith(self, propertyDefinition, propertyAccess, REQUEST=None):
        """
            Attempts to update the specified property on the
            object implementing the PropertyAccess interface with the
            specified HTTP REQUEST.
        """
        dateTime = ""
        if propertyDefinition.getIdentity() == "defaultDatetime":
            dateTimeValue = REQUEST['kedefaultDatetime']
           
            try:
               dateTimeCheck =  DateTime(dateTimeValue)
               dateTime = dateTimeValue
            except:
                if len(dateTimeValue) > 0:
                    if dateTimeValue.find('now +') != -1 or dateTimeValue.find('now+') != -1:
                        valueComponent = dateTimeValue.split('+')
                        d = DateTime() + valueComponent[1]
                        dateTime = d.strftime("%Y-%m-%d %I:%M %p")
                    elif dateTimeValue.find('now -') != -1 or dateTimeValue.find('now-') != -1:
                        valueComponent = dateTimeValue.split('-')
                        d = DateTime() - valueComponent[1]
                        dateTime = d.strftime("%Y-%m-%d %I:%M %p")
                    else:
                        d = DateTime()
                        dateTime = d.strftime("%Y-%m-%d %I:%M %p")
            propertyAccess.setPropertyValue(propertyDefinition.getIdentity(), dateTime)
 
        else:       
            #is write permitted on the specified property?
            if propertyDefinition.isWritePermitted():
                
                # Check we have a value if it isMandatory
                propertyDefinition.verifyMandatoryValue(REQUEST["ke%s" % (propertyDefinition.getIdentity(),)])
                
                #set the value for the property from the REQUEST
                propertyAccess.setPropertyValue(propertyDefinition.getIdentity(), REQUEST["ke%s" % (propertyDefinition.getIdentity(),)])
                        
    #---------------------------------------------------------------#

#####################################################################
## Class Initialisation

# Register Editlet Information with the Knowledge Engine
registerEditlet("DatetimeSelectorEditlet", DatetimeSelectorEditlet())

#####################################################################
